use actix_web::{web, App, HttpResponse, HttpServer, Responder};
use reqwest;
use serde::{Deserialize, Serialize};
use tokio::time;

#[derive(Serialize, Deserialize, Debug)]
struct Config {
    id: u32,
    name: String,
    value: String,
}

// 获取配置的函数（从server端获取配置）
async fn fetch_config(config_id: u32) {
    match reqwest::get(&format!("http://localhost:8080/config/{}", config_id)).await {
        Ok(response) => {
            println!("Response Status: {}", response.status());
            if response.status().is_success() {
                match response.json::<Config>().await {
                    Ok(config) => {
                        println!("Fetched config: {:?}", config);
                    }
                    Err(_) => {
                        println!("Failed to parse response as Config.");
                    }
                }
            } else {
                println!("Request failed with status: {}", response.status());
            }
        }
        Err(e) => {
            println!("Request failed: {:?}", e);
        }
    }
}

// agent端接收server端的配置同步请求
async fn apply_config(config: web::Json<Config>) -> impl Responder {
    // 这里可以将配置应用到系统或应用程序中
    println!("Applying config: {:?}", config);

    // 模拟配置应用后的结果，实际情况可以根据需求调整
    HttpResponse::Ok().body("Config applied successfully")
}

#[tokio::main]
async fn main() -> std::io::Result<()> {
    // 异步任务获取配置
    tokio::spawn(async {
        let config_id = 1; // 配置ID，可以根据需要修改
        fetch_config(config_id).await;
    });

    // 启动 agent 的 HTTP 服务器以接收 server 端的配置同步请求
    HttpServer::new(|| {
        App::new()
            .route("/apply_config", web::post().to(apply_config))  // 接收配置同步请求
    })
    .bind("127.0.0.1:8081")?  // 本地运行在8081端口，server将向这个地址发送请求
    .run()
    .await
}
